package org.example.test.controller;

import org.example.test.dal.entity.Cart;
import org.example.test.dal.entity.CartItem;
import org.example.test.model.OrdersModel;
import org.example.test.request.CartItemRequest;
import org.example.test.response.CommonResponse;
import org.example.test.response.ResponseBuilder;
import org.example.test.service.CartService;
import org.example.test.service.OrdersService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 购物车控制器
 * 提供购物车商品管理、结算等相关接口
 */
@RestController
@RequestMapping("/carts")
public class CartsController {
    // 日志记录器
    private static final Logger LOGGER = LoggerFactory.getLogger(CartsController.class);

    @Autowired
    private CartService cartService;  // 购物车服务

    @Autowired
    private OrdersService ordersService;  // 订单服务

    /**
     * 添加商品到购物车
     * @param userName 用户名
     * @param cartItemRequest 购物车商品请求参数
     * @return 操作结果
     */
    @PostMapping("/addItemToCart")
    public CommonResponse addItemToCart(@RequestParam Long userName, @RequestBody CartItemRequest cartItemRequest) {
        try {
            LOGGER.info("添加商品到购物车请求 - 用户名: {}, 商品信息: {}", userName, cartItemRequest);
            cartService.addItemToCart(userName, cartItemRequest);  // 调用服务层添加商品
            return ResponseBuilder.success();  // 返回成功响应
        } catch (Exception e) {
            LOGGER.error("添加商品到购物车失败", e);  // 记录错误日志
            return ResponseBuilder.error(e.getMessage());  // 返回错误响应
        }
    }

    /**
     * 从购物车移除商品
     * @param userId 用户ID
     * @param productIds 要移除的商品ID列表
     * @return 操作结果
     */
    @PostMapping("/removeItemsFromCart")
    public CommonResponse removeItemsFromCart(@RequestParam Long userId, @RequestParam List<Long> productIds) {
        try {
            LOGGER.info("从购物车移除商品请求 - 用户ID: {}, 商品ID列表: {}", userId, productIds);
            cartService.removeItemsFromCart(userId, productIds);  // 调用服务层移除商品
            return ResponseBuilder.success();  // 返回成功响应
        } catch (Exception e) {
            LOGGER.error("从购物车移除商品失败", e);  // 记录错误日志
            return ResponseBuilder.error(e.getMessage());  // 返回错误响应
        }
    }

    /**
     * 获取购物车信息
     * @param userId 用户ID
     * @return 购物车详情
     */
    @GetMapping("/getCart")
    public CommonResponse getCart(@PathVariable Long userId) {
        try {
            LOGGER.info("获取购物车请求 - 用户ID: {}", userId);
            Cart cart = cartService.getCart(userId);  // 调用服务层获取购物车
            return ResponseBuilder.success(cart);  // 返回成功响应
        } catch (Exception e) {
            LOGGER.error("获取购物车失败", e);  // 记录错误日志
            return ResponseBuilder.error(e.getMessage());  // 返回错误响应
        }
    }

    /**
     * 获取购物车商品列表
     * @param userId 用户ID
     * @return 购物车商品列表
     */
    @GetMapping("/getCartItems")
    public CommonResponse getCartItems(@RequestParam Long userId) {
        try {
            LOGGER.info("获取购物车商品列表请求 - 用户ID: {}", userId);
            List<CartItem> cartItems = cartService.getCartItems(userId);  // 调用服务层获取商品列表
            System.out.println("后端购物车信息："+cartItems);  // 调试日志
            return ResponseBuilder.success(cartItems);  // 返回成功响应
        } catch (Exception e) {
            LOGGER.error("获取购物车商品列表失败", e);  // 记录错误日志
            return ResponseBuilder.error(e.getMessage());  // 返回错误响应
        }
    }

    /**
     * 结算购物车
     * @param userId 用户ID
     * @param productIds 要结算的商品ID列表
     * @param totalPrice 订单总金额
     * @return 生成的订单信息
     */
    @GetMapping("/checkout")
    public CommonResponse checkout(@RequestParam Long userId, @RequestBody List<Long> productIds, @RequestParam Double totalPrice) {
        try {
            LOGGER.info("购物车结算请求 - 用户ID: {}, 商品ID列表: {}", userId, productIds);
            OrdersModel order = ordersService.checkoutCart(userId, productIds, totalPrice);  // 调用服务层结算
            return ResponseBuilder.success(order);  // 返回成功响应(包含订单信息)
        } catch (Exception e) {
            LOGGER.error("购物车结算失败", e);  // 记录错误日志
            return ResponseBuilder.error(e.getMessage());  // 返回错误响应
        }
    }
}